﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaDocCNH
    {
        #region Variaveis Membro
        private int _idCNH;
        private int _idPessoa;
        //private Pessoa _pessoa;
        private int _numRegistro;
        private DateTime _dataPrimeiraCNH;
        private DateTime _dataValidadeCNH;
        private Status _status;
        private string _path;
        private List<CategoriaCNH> _categoriaCNH;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdCNH
        {
            get { return _idCNH; }
            set { _idCNH = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        //public Pessoa Pessoa
        //{
        //    get { return _pessoa; }
        //    set { _pessoa = value; }
        //}
        public int NumRegistro
        {
            get { return _numRegistro; }
            set { _numRegistro = value; }
        }
        public DateTime DataPrimeiraCNH
        {
            get { return _dataPrimeiraCNH; }
            set { _dataPrimeiraCNH = value; }
        }
        public DateTime DataValidadeCNH
        {
            get { return _dataValidadeCNH; }
            set { _dataValidadeCNH = value; }
        }
        public Status Status
        {
            get { return _status; }
            set { _status = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        public List<CategoriaCNH> CategoriaCNH
        {
            get { return _categoriaCNH; }
            set { _categoriaCNH = value; }
        }
        #endregion

        #region Construtores
        public PessoaDocCNH()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaDocCNH(int idCNH)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idCNH);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region MetodosPrivados
        private void Carregar(int idCNH)
        {
            try
            {
                var consulta = from cnh in _context.tab_pessoa_cnh
                               where cnh.Id_cnh == idCNH
                               select new
                               {
                                   cnh.Id_cnh,
                                   cnh.tab_pessoa.Id_pessoa,
                                   cnh.Num_registro,
                                   cnh.dt_primeira_cnh,
                                   cnh.dt_validade_cnh,
                                   cnh.tab_status.id_status,
                                   cnh.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdCNH = list.Id_cnh;
                    this.IdPessoa = list.Id_pessoa;
                    this.NumRegistro = list.Num_registro;
                    this.DataPrimeiraCNH = list.dt_primeira_cnh;
                    this.DataValidadeCNH = list.dt_validade_cnh;
                    this.Status = new Status(list.id_status);
                    this.Path = list.path; 
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from cnh in _context.tab_pessoa_cnh
                               where cnh.tab_pessoa.Id_pessoa == this.IdPessoa
                               && cnh.Num_registro == this.NumRegistro
                               && cnh.dt_primeira_cnh == this.DataPrimeiraCNH
                               && cnh.dt_validade_cnh == this.DataValidadeCNH
                               orderby cnh.Id_cnh descending
                               select cnh;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdCNH = list.Id_cnh;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Métodos Públicos

        #region Metodos de Selecao
        public List<PessoaDocCNH> SelectAll()
        {
            try
            {
                List<PessoaDocCNH> listPessoaDocCNH = new List<PessoaDocCNH>();

                var consulta = from cnh in _context.tab_pessoa_cnh
                               select new
                               {
                                   cnh.Id_cnh,
                                   cnh.tab_pessoa.Id_pessoa,
                                   cnh.Num_registro,
                                   cnh.dt_primeira_cnh,
                                   cnh.dt_validade_cnh,
                                   cnh.tab_status.id_status,
                                   cnh.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocCNH cnh = new PessoaDocCNH();
                    cnh.IdCNH = list.Id_cnh;
                    cnh.IdPessoa = list.Id_pessoa;
                    cnh.NumRegistro = list.Num_registro;
                    cnh.DataPrimeiraCNH = list.dt_primeira_cnh;
                    cnh.DataValidadeCNH = list.dt_validade_cnh;
                    cnh.Status = new Status(list.id_status);
                    cnh.Path = list.path;

                    listPessoaDocCNH.Add(cnh);
                }

                return listPessoaDocCNH;
            }
            catch (Exception)
            {
                
                throw;
            }
        }
        public List<PessoaDocCNH> SelectCNH(int _idcategoriaCNH)
        {
            try
            {
                List<PessoaDocCNH> listPessoaDocCNH = new List<PessoaDocCNH>();

                var consulta = (from cnh in _context.tab_pessoa_cnh
                                join cnhcategoria in _context.tab_pessoa_cnh_categoria on cnh.Id_cnh equals cnhcategoria.tab_pessoa_cnh.Id_cnh
                                where cnhcategoria.tab_categoria_cnh.id_categoria_cnh == _idcategoriaCNH
                                select cnh);

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocCNH cnh = new PessoaDocCNH();
                    cnh.IdCNH = list.Id_cnh;
                    cnh.NumRegistro = list.Num_registro;
                    cnh.DataPrimeiraCNH = list.dt_primeira_cnh;
                    cnh.DataValidadeCNH = list.dt_validade_cnh;
                    cnh.Status = new Status(list.tab_status.id_status);

                    listPessoaDocCNH.Add(cnh);
                }

                return listPessoaDocCNH;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaDocCNH> SelectPorPessoa(int idPessoa)
        {
            try
            {
                List<PessoaDocCNH> listPessoaDocCNH = new List<PessoaDocCNH>();

                var consulta = from cnh in _context.tab_pessoa_cnh
                               where cnh.tab_pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   cnh.Id_cnh,
                                   cnh.tab_pessoa.Id_pessoa,
                                   cnh.Num_registro,
                                   cnh.dt_primeira_cnh,
                                   cnh.dt_validade_cnh,
                                   cnh.tab_status.id_status,
                                   cnh.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocCNH cnh = new PessoaDocCNH();
                    cnh.IdCNH = list.Id_cnh;
                    cnh.IdPessoa = list.Id_pessoa;
                    cnh.NumRegistro = list.Num_registro;
                    cnh.DataPrimeiraCNH = list.dt_primeira_cnh;
                    cnh.DataValidadeCNH = list.dt_validade_cnh;
                    cnh.Status = new Status(list.id_status);
                    cnh.Path = list.path;

                    listPessoaDocCNH.Add(cnh);
                }

                return listPessoaDocCNH;
            }
            catch (Exception)
            {

                throw;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdCNH == 0)
                {
                    tab_pessoa_cnh tabCNH = new tab_pessoa_cnh();

                    tabCNH.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabCNH.Num_registro = this.NumRegistro;
                    tabCNH.dt_primeira_cnh = this.DataPrimeiraCNH;
                    tabCNH.dt_validade_cnh = this.DataValidadeCNH;
                    tabCNH.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", this.Status.IdStatus);

                    _context.AddTotab_pessoa_cnh(tabCNH);
                    _context.SaveChanges();

                    RecuperaId();
                }
                else
                {
                    tab_pessoa_cnh tabCNH = (from cnh in _context.tab_pessoa_cnh
                                             where cnh.Id_cnh == this.IdCNH
                                             select cnh).First();

                    tabCNH.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabCNH.Num_registro = this.NumRegistro;
                    tabCNH.dt_primeira_cnh = this.DataPrimeiraCNH;
                    tabCNH.dt_validade_cnh = this.DataValidadeCNH;
                    tabCNH.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", this.Status.IdStatus);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdCNH != 0)
                {
                    tab_pessoa_cnh tabCNH = (from cnh in _context.tab_pessoa_cnh
                                             where cnh.Id_cnh == this.IdCNH
                                             select cnh).First();

                    tabCNH.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
